home *** CD-ROM | disk | FTP | other *** search
- #ifndef PROCPS_PROC_READPROC_H
- #define PROCPS_PROC_READPROC_H
-
- // New Interface to Process Table -- PROCTAB Stream (a la Directory streams)
- // Copyright 1996 Charles L. Blake.
- // Copyright 1998 Michael K. Johnson
- // Copyright 1998-2003 Albert Cahalan
- // May be distributed under the terms of the
- // GNU Library General Public License, a copy of which is provided
- // in the file COPYING
-
-
- #include "procps.h"
- #include "pwcache.h"
-
- #define SIGNAL_STRING
-
- EXTERN_C_BEGIN
-
- // ld cutime, cstime, priority, nice, timeout, alarm, rss,
- // c state,
- // d ppid, pgrp, session, tty, tpgid,
- // s signal, blocked, sigignore, sigcatch,
- // lu flags, min_flt, cmin_flt, maj_flt, cmaj_flt, utime, stime,
- // lu rss_rlim, start_code, end_code, start_stack, kstk_esp, kstk_eip,
- // lu start_time, vsize, wchan,
-
- // This is to help document a transition from pid to tgid/tid caused
- // by the introduction of thread support. It is used in cases where
- // neither tgid nor tid seemed correct. (in other words, FIXME)
- #define XXXID tid
-
- // Basic data structure which holds all information we can get about a process.
- // (unless otherwise specified, fields are read from /proc/#/stat)
- //
- // Most of it comes from task_struct in linux/sched.h
- //
- typedef struct proc_t {
- // 1st 16 bytes
- int
- tid, // (special) task id, the POSIX thread ID (see also: tgid)
- ppid; // stat,status pid of parent process
- unsigned
- pcpu; // stat (special) %CPU usage (is not filled in by readproc!!!)
- char
- state, // stat,status single-char code for process state (S=sleeping)
- pad_1, // n/a padding
- pad_2, // n/a padding
- pad_3; // n/a padding
- // 2nd 16 bytes
- unsigned long long
- utime, // stat user-mode CPU time accumulated by process
- stime, // stat kernel-mode CPU time accumulated by process
- // and so on...
- cutime, // stat cumulative utime of process and reaped children
- cstime, // stat cumulative stime of process and reaped children
- start_time; // stat start time of process -- seconds since 1-1-70
- #ifdef SIGNAL_STRING
- char
- // Linux 2.1.7x and up have 64 signals. Allow 64, plus '\0' and padding.
- signal[18], // status mask of pending signals
- blocked[18], // status mask of blocked signals
- sigignore[18], // status mask of ignored signals
- sigcatch[18]; // status mask of caught signals
- #else
- long long
- // Linux 2.1.7x and up have 64 signals.
- signal, // status mask of pending signals
- blocked, // status mask of blocked signals
- sigignore, // status mask of ignored signals
- sigcatch; // status mask of caught signals
- #endif
- unsigned KLONG
- start_code, // stat address of beginning of code segment
- end_code, // stat address of end of code segment
- start_stack, // stat address of the bottom of stack for the process
- kstk_esp, // stat kernel stack pointer
- kstk_eip, // stat kernel instruction pointer
- wchan; // stat (special) address of kernel wait channel proc is sleeping in
- long
- priority, // stat kernel scheduling priority
- nice, // stat standard unix nice level of process
- rss, // stat resident set size from /proc/#/stat (pages)
- alarm, // stat ?
- // the next 7 members come from /proc/#/statm
- size, // statm total # of pages of memory
- resident, // statm number of resident set (non-swapped) pages (4k)
- share, // statm number of pages of shared (mmap'd) memory
- trs, // statm text resident set size
- lrs, // statm shared-lib resident set size
- drs, // statm data resident set size
- dt; // statm dirty pages
- unsigned long
- vm_size, // status same as vsize in kb
- vm_lock, // status locked pages in kb
- vm_rss, // status same as rss in kb
- vm_data, // status data size
- vm_stack, // status stack size
- vm_exe, // status executable size
- vm_lib, // status library size (all pages, not just used ones)
- rtprio, // stat real-time priority
- sched, // stat scheduling class
- vsize, // stat number of pages of virtual memory ...
- rss_rlim, // stat resident set size limit?
- flags, // stat kernel flags for the process
- min_flt, // stat number of minor page faults since process start
- maj_flt, // stat number of major page faults since process start
- cmin_flt, // stat cumulative min_flt of process and child processes
- cmaj_flt; // stat cumulative maj_flt of process and child processes
- char
- **environ, // (special) environment string vector (/proc/#/environ)
- **cmdline; // (special) command line string vector (/proc/#/cmdline)
- char
- // Be compatible: Digital allows 16 and NT allows 14 ???
- euser[P_G_SZ], // stat(),status effective user name
- ruser[P_G_SZ], // status real user name
- suser[P_G_SZ], // status saved user name
- fuser[P_G_SZ], // status filesystem user name
- rgroup[P_G_SZ], // status real group name
- egroup[P_G_SZ], // status effective group name
- sgroup[P_G_SZ], // status saved group name
- fgroup[P_G_SZ], // status filesystem group name
- cmd[16]; // stat,status basename of executable file in call to exec(2)
- struct proc_t
- *ring, // n/a thread group ring
- *next; // n/a various library uses
- int
- pgrp, // stat process group id
- session, // stat session id
- nlwp, // stat,status number of threads, or 0 if no clue
- tgid, // (special) task group ID, the POSIX PID (see also: tid)
- tty, // stat full device number of controlling terminal
- euid, egid, // stat(),status effective
- ruid, rgid, // status real
- suid, sgid, // status saved
- fuid, fgid, // status fs (used for file access only)
- tpgid, // stat terminal process group id
- exit_signal, // stat might not be SIGCHLD
- processor; // stat current (or most recent?) CPU
- } proc_t;
-
- // PROCTAB: data structure holding the persistent information readproc needs
- // from openproc(). The setup is intentionally similar to the dirent interface
- // and other system table interfaces (utmp+wtmp come to mind).
-
- #include <sys/types.h>
- #include <dirent.h>
- #include <unistd.h>
-
- #define PROCPATHLEN 64 // must hold /proc/2000222000/task/2000222000/cmdline
-
- typedef struct PROCTAB {
- DIR* procfs;
- // char deBug0[64];
- DIR* taskdir; // for threads
- // char deBug1[64];
- pid_t taskdir_user; // for threads
- int did_fake; // used when taskdir is missing
- int(*finder)(struct PROCTAB *restrict const, proc_t *restrict const);
- proc_t*(*reader)(struct PROCTAB *restrict const, proc_t *restrict const);
- int(*taskfinder)(struct PROCTAB *restrict const, const proc_t *restrict const, proc_t *restrict const, char *restrict const);
- proc_t*(*taskreader)(struct PROCTAB *restrict const, const proc_t *restrict const, proc_t *restrict const, char *restrict const);
- pid_t* pids; // pids of the procs
- uid_t* uids; // uids of procs
- int nuid; // cannot really sentinel-terminate unsigned short[]
- int i; // generic
- unsigned flags;
- unsigned u; // generic
- void * vp; // generic
- char path[PROCPATHLEN]; // must hold /proc/2000222000/task/2000222000/cmdline
- unsigned pathlen; // length of string in the above (w/o '\0')
- } PROCTAB;
-
- // initialize a PROCTAB structure holding needed call-to-call persistent data
- extern PROCTAB* openproc(int flags, ... /* pid_t*|uid_t*|dev_t*|char* [, int n] */ );
-
- typedef struct proc_data_t {
- proc_t **tab;
- proc_t **proc;
- proc_t **task;
- int n;
- int nproc;
- int ntask;
- } proc_data_t;
-
- extern proc_data_t *readproctab2(int(*want_proc)(proc_t *buf), int(*want_task)(proc_t *buf), PROCTAB *restrict const PT);
-
- // Convenient wrapper around openproc and readproc to slurp in the whole process
- // table subset satisfying the constraints of flags and the optional PID list.
- // Free allocated memory with exit(). Access via tab[N]->member. The pointer
- // list is NULL terminated.
-
- extern proc_t** readproctab(int flags, ... /* same as openproc */ );
-
- // clean-up open files, etc from the openproc()
- extern void closeproc(PROCTAB* PT);
-
- // retrieve the next process matching the criteria set by the openproc()
- extern proc_t* readproc(PROCTAB *restrict const PT, proc_t *restrict p);
- extern proc_t* readtask(PROCTAB *restrict const PT, const proc_t *restrict const p, proc_t *restrict t);
-
- // warning: interface may change
- extern int read_cmdline(char *restrict const dst, unsigned sz, unsigned pid);
-
- extern void look_up_our_self(proc_t *p);
-
- // deallocate space allocated by readproc
-
- extern void freeproc(proc_t* p);
-
- //fill out a proc_t for a single task
- extern proc_t * get_proc_stats(pid_t pid, proc_t *p);
-
- // openproc/readproctab:
- //
- // Return PROCTAB* / *proc_t[] or NULL on error ((probably) "/proc" cannot be
- // opened.) By default readproc will consider all processes as valid to parse
- // and return, but not actually fill in the cmdline, environ, and /proc/#/statm
- // derived memory fields.
- //
- // `flags' (a bitwise-or of PROC_* below) modifies the default behavior. The
- // "fill" options will cause more of the proc_t to be filled in. The "filter"
- // options all use the second argument as the pointer to a list of objects:
- // process status', process id's, user id's. The third
- // argument is the length of the list (currently only used for lists of user
- // id's since uid_t supports no convenient termination sentinel.)
-
- #define PROC_FILLMEM 0x0001 // read statm
- #define PROC_FILLCOM 0x0002 // alloc and fill in `cmdline'
- #define PROC_FILLENV 0x0004 // alloc and fill in `environ'
- #define PROC_FILLUSR 0x0008 // resolve user id number -> user name
- #define PROC_FILLGRP 0x0010 // resolve group id number -> group name
- #define PROC_FILLSTATUS 0x0020 // read status -- currently unconditional
- #define PROC_FILLSTAT 0x0040 // read stat -- currently unconditional
- #define PROC_FILLWCHAN 0x0080 // look up WCHAN name
- #define PROC_FILLARG 0x0100 // alloc and fill in `cmdline'
-
- #define PROC_LOOSE_TASKS 0x0200 // threat threads as if they were processes
-
- // Obsolete, consider only processes with one of the passed:
- #define PROC_PID 0x1000 // process id numbers ( 0 terminated)
- #define PROC_UID 0x4000 // user id numbers ( length needed )
-
- // it helps to give app code a few spare bits
- #define PROC_SPARE_1 0x01000000
- #define PROC_SPARE_2 0x02000000
- #define PROC_SPARE_3 0x04000000
- #define PROC_SPARE_4 0x08000000
-
- EXTERN_C_END
- #endif
-